perm filename HALIO.PAL[HAL,HE]14 blob
sn#252556 filedate 1976-12-10 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00005 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 .SBTTL Basic TTY input and output routines
C00003 00003 TTY output routines TYPSTR, TYPDEC, TYPOCT, TYPCHR
C00008 00004 Macros: OUTSTR, NUMOUT, ASCIE, CRLF, HALERR, ERRTRAP
C00012 00005 IOINIT, INSTR, system line buffers
C00015 ENDMK
C⊗;
.SBTTL Basic TTY input and output routines
.EVEN
; TTY output routines TYPSTR, TYPDEC, TYPOCT, TYPCHR
; Modified 5-Sep-74 by RF. Originally written by KKP.
COMMENT ⊗ Output a string, ending with a zero character. Pointer to
start of string in R0. Called in "simple" style. ⊗
TYPSTR: MOV R0,R1 ;R1 ← LOC[STRING]
MOVB (R1)+,R0 ;R0 ← first byte of string
1$: BEQ 2$ ;If null, exit now.
JSR PC,TYPCHR ;Type this one character
MOVB (R1)+,R0 ;R0 ← Next byte of string
BNE 1$ ;If more to come, repeat.
2$: RTS PC ;Done
COMMENT ⊗ Routines to output numbers. Argument in R0. TYPDEC
outputs in base 10, and TYPOCT in base 8. Both use TYPDIG as a
subroutine, putting the digit in R0. TYPCHR is a general purpose
character output routine. It looks at OUTSW to see where to direct
the output. ⊗
TYPDEC: MOV #12,RADIX ;To output in base 10
BR TYPDIG ;Go type it.
TYPOCT: MOV #8,RADIX ;To output in base 8.
BR TYPDIG ;Go type it.
TYPDIG: MOV R0,R1 ;Need dividend in R1, with R0 clear.
CLR R0 ;Clear upper half of dividend.
DIV (PC)+,R0 ;Divide argument in R0, R1 by radix.
RADIX: 12 ;Starts out in decimal.
BEQ TYPOUT ;If quotient zero, then can print.
MOV R1,-(SP) ;Else stack quotient
JSR PC,TYPDIG ;Recursive call.
MOV (SP)+,R1 ;Unstack last quotient
TYPOUT: ADD #'0,R1 ;Form TTY code for digit
MOV R1,R0 ;Need argument for TYPCHR in R0.
TYPCHR: TST OUTSW ;VT05 or console?
BEQ 3$ ;
TSTB KBOS ;VT05: Is it available?
BMI 2$ ;Yes.
1$:
.IFDF KERNEL
.IFNZ KERNEL
SLEEP #2 ;No. Sleep a while, try again
.ENDC
.ENDC
BR TYPCHR ;
2$: MOVB R0,KBOR ;Output a byte to it.
CMP #12,R0 ;Was it a line feed?
BNE TYPRET ;If not that code, then done.
CLR R0 ;Otherwise, output 3 nulls.
JSR PC,TYPCHR ;
JSR PC,TYPCHR ;
JMP TYPCHR ;Direct jump; it will return to caller.
3$: TSTB OREG ;Console: Ready?
BNE 1$ ;No.
MOVB R0,OREG ;Yes. Output a byte to it.
MOV #1,172566 ;Wake up pdp10 by generating interrupt
TYPRET: RTS PC ;Return.
; Macros: OUTSTR, NUMOUT, ASCIE, CRLF, HALERR, ERRTRAP
.MACRO OUTSTR B ;Type string starting at B.
MOV R0,-(SP) ;Save R0. Who knows what was happening in it?
MOV R1,-(SP) ;Save R1.
MOV #B,R0 ;Load up the string to be output
JSR PC,TYPSTR ;Call the string output utility routine.
MOV (SP)+,R1 ;Restore R1.
MOV (SP)+,R0 ;Restore R0.
.ENDM
.MACRO NUMOUT ;Type out the number in AC0 with CVG using OUTBUF
MOV R0,-(SP) ;Save the registers
MOV R1,-(SP)
STF AC0,-(SP)
STF AC1,-(SP)
MOV #OUTBUF,R0 ;Use OUTBUF to construct the string
JSR PC,CVG ;Convert floating point number to asc
LDF (SP)+,AC1 ;Restore the floating point registers
LDF (SP)+,AC0
MOV #OUTBUF,R0 ;Set pointer for i/o routine
JSR PC,TYPSTR ;Type out the number
MOV (SP)+,R1 ;Restore the registers
MOV (SP)+,R0
.ENDM
.MACRO ASCIE STR
.ASCIZ STR
.EVEN
.ENDM
.MACRO CRLF
OUTSTR CRLFX ;Carriage return, line feed.
.ENDM
CRLFX: .ASCIZ /
/
RUGMES: ASCIE </π
--ONLY DDT CAN HELP YOU NOW!
π/>
ERRTRAP:
; Pointer to message is on stack. Print it, restore state, go to DDT
MOV R0,-(SP) ;Save R0.
MOV R1,-(SP) ;Save R1.
.IFDF KERNEL
.IFNZ KERNEL
EVWAIT CSLEVT ;Grab the console
.ENDC
.ENDC
MOV #CRLFX,R0 ;Move to new line
JSR PC,TYPSTR ;
MOV 6(SP),R0 ;Type out message
JSR PC,TYPSTR ;
MOV #RUGMES,R0 ;Type out RUGMES
JSR PC,TYPSTR ;
.IFDF KERNEL
.IFNZ KERNEL
EVSIG CSLEVT ;Release the console
.ENDC
.ENDC
MOV (SP)+,R1 ;Restore R1.
MOV (SP)+,R0 ;Restore R0.
MOV (SP)+,(SP) ;put return address only on stack.
BPT ;Breakpoint to DDT.
RTS PC ;Return to calling point.
PUTLOC LERRTRAP, ERRTRAP
; IOINIT, INSTR, system line buffers
CSLEVT: 0 ;Console interlock event
IOINIT:
.IFDF KERNEL
.IFNZ KERNEL
EV↓≠β⊗$∩v~∀%≠∨,@!' RY
'→-P∩v~∀%-'∪≤∩∩w≠¬WJAB↓G←]g=YJAS9iKeY=GVAKYK]h~(@@@@9≥ ε4∀@@@]≥ ~∀∪%Q&A!ε$∩v~∀4∃π∨≠5≥(@XA'ie%]NAEeiJAa=S]iKHACeOU[K]h↓S\A$@\@Aα↓GCee%COJAIKike8ASf~)Cggk5KHAi<AEJAQQJAC
iSmCQS←\A
QCeC
iKd\↓αAek ←khA%fABA⊃KYKi%]N~∃ CGWgACGJA
QCeC
iKd\AβhAQQJAG=[aYKQS←\A=LAiQ%fAe←UiS]J↓BA]k1X~∃G!CeCGQKdASLAaYC
KHACPAiQJ↓K]HA=LAiQ∀AS]aUhAgiIS]N\A$`AQQK\AA←S]iL~∃i↑↓iQJA9kYXA
QCeC
iKd\A%KO%giKeLAkgK⊂tA$`↓aCgg∃fAiQ∀ACeOU[K]h0A$bA%f~∃O¬eECO∃H\@@X~∀~∃%≥')$h∪π→$%ππ≥($∩w%M(Aπ!β%βπQ$Aπ=+≥(~)∪≤dt%)'(@%∨+)'\∩∩w-P`jA∨HAπ∨≥M∨→
}4∀∪¬D@∪π∨9'∪≤∩4∀∪)'Q∧∪↔¬%&∩∩wQ'(A%A↔e¬∨β%⊂A%β⊃2~∀∪ "∪∪8d∩∩w]β∪(AQ∪→_A%(A∪&4∀∪≠∨Y∧∪↔¬%$Y$b$∩w∂PAαAπ!β%βπQ$~∀%¬$∪∂=)πβ$4∃π∨≥M∪≤t∪5∨,∪∪I∞Y$D∩∩w¬e)
A
I∨~A!⊃ b`}4∀∪¬D∪∪≤d$∩w≥≡4∀∪π→H∪∪%≤~∃∂∨Qπβ$t%¬∪ε@@@@FDnnl`@Y$b∩m≠β'⊗↓∨
@4A≠β↔∀A∪(@\A¬∪)L~∀∪π5 ∪$b0Fbnn$∩wπ∨5!β%
↓)≡A¬LAπ⊃βIβπ)H~∀∪¬9
∩bH$∩w'↔% A∪↓∪)&A9∨(~∀%)'(∪
π≥(∩$wπ⊃
⊗A∪↓β≥2A
⊃β%β
)%&↓∪≤A¬U
$4∀∪¬D∪∪≤d$∩w
∨I∂(A βπ⊗AM!βπ
↓∪A≥<Aπ⊃βH\~∀∪⊃ε@@@A$`@@∩∩m%≠∨Y
A→βM(Aπ⊃¬%βπ)∃$A∪≤↓¬+
∃$~∀∪⊃ε∪π
≥(∩∩m π%∃≠≥(↓π⊃β%¬π)$↓π∨+≥P~∀∪∨U)')$A ¬&$∩w!I
∨%~↓αA 1)∪≥≤A¬βπ-'!βπ∀~∀∪¬H@@@@A∪≤d4∀bHt%π≠ ∪HbXFbT∩∩wπ=≠!β%∀A)≡A
$Aπ⊃¬%βπ)∃$~∀∪ "@@@@dH@@∩∩mπ∨≥)%≥+
AIβ ∪9∞A∪↓∪)&A9∨(Aα↓π$~∀%π≠ ∪HbXFh@∩∩wπ!π⊗A%Aπ⊃¬%βπ)∃$A→≥β_~∀%¬→(∪%≤d∩∩m∪∂≥∨HA∪A%(A∪&4∀@@@∪≠∨-λ∪$bX!$`RV$w'β-∀A)⊃
↓π⊃β%¬π)$4∀@@@∪∪≥ε%ππ≥($∩w∪≥
%≠9(Aπ⊃¬%βπ)∃$Aπ∨U≥(~∀%≠∨,∪H`XZQM R∩w∃π⊃≡AQ⊃
Aπ!β%βπQ$~∀%≠∨,∪HbY$`4∀∪∃'H∪!εYQ3!π⊃H~∀∪≠=,∩Q'@RVY$@~∀∪¬H@∪∪≤H∩∩wπ=≥)∪≥U
A%¬ ∪≥∞4∀dHt@∪π%1∩∩∩m∪A∪PA∪&A∧Aπ$X↓)3!
↓αAπ$↓β≥λA1~∀∪5∨-∧∪HbXQ$@RV∩wA+(Aα↓π$A∪8A)⊃
↓')%∪9∞~∀∪5∨-∧@@@F`0Q$`R$∩w!+PA∪≤A∧A≥+→0Aπ⊃βIβπ)H~∀∪%Q&∪!ε$∩w%Q+%≤~)ππ≥(h∩`~∃⊃¬&t∩9¬3)
$b`Xh@Xb`X@~∀~∀m'sgi∃ZAYS9JAEk→MKef4∀~∃∪9¬+t$]¬→↔\∩hd\4∃∨+) +t∩9¬→↔.$hd\~)π+%∪8t∪∪≥ +∩∩mπkee∃]hAY%]JAa=S]iKH~∀